home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 November: Tool Chest / Dev.CD Nov 98 TC.toast / Sample Code / Snippets / Processes / LaunchWithSize / LaunchWithSize.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-05-17  |  2.7 KB  |  130 lines  |  [TEXT/CWIE]

  1. #define OLDROUTINELOCATIONS        0
  2. #define OLDROUTINENAMES            0
  3. #define SystemSevenOrLater        1
  4.  
  5. #ifndef __FONTS__
  6. #    include <Fonts.h>
  7. #endif
  8.  
  9. #ifndef __DIALOGS__
  10. #    include <Dialogs.h>
  11. #endif
  12.  
  13. #ifndef __PROCESSES__
  14. #    include <Processes.h>
  15. #endif
  16.  
  17. #ifndef __OSUTILS__
  18. #    include <OSUtils.h>
  19. #endif
  20.  
  21. #ifndef __RESOURCES__
  22. #    include <Resources.h>
  23. #endif
  24.  
  25. #ifndef __TRAPS__
  26. #    include <Traps.h>
  27. #endif
  28.  
  29. static pascal OSErr InitMac (void)
  30. {
  31.     MaxApplZone ( );
  32.     InitGraf (&(qd.thePort));
  33.     InitFonts ( );
  34.     InitWindows ( );
  35.     InitMenus ( );
  36.     TEInit ( );
  37.     InitDialogs (nil);
  38.  
  39.     return noErr;
  40. }
  41.  
  42. typedef struct
  43. {
  44.     short    flags;
  45.     Size    preferred,
  46.             minimum;
  47. }
  48. tSizeResource, *tSizeResourceP, **tSizeResourceH;
  49.  
  50. typedef pascal Handle (*vGet1Resource) (ResType resType, short resID);
  51.  
  52. static Size                gPreferredLaunchSize;
  53. static vGet1Resource    gGet1Resource;
  54.  
  55. static pascal Handle MyGet1ResourceC (ResType resType, short resID)
  56. {
  57.     long savedA5 = SetCurrentA5 ( );
  58.     Handle result = gGet1Resource (resType,resID);
  59.  
  60.     if (resType == 'SIZE' && !ResError ( ) && result)
  61.     {
  62.         tSizeResourceH sizeResourceH = (tSizeResourceH) result;
  63.         (**sizeResourceH).preferred = gPreferredLaunchSize;
  64.     }
  65.  
  66.     SetA5 (savedA5);
  67.     return result;
  68. }
  69.  
  70. static asm pascal Handle MyGet1ResourceAsm (ResType resType, short resID)
  71. {
  72.     MOVE.L        A1,-(A7)            // save reg
  73.     MOVE.L        D1,-(A7)            // save reg
  74.     MOVE.L        D2,-(A7)            // save reg
  75.     SUBQ.L        #4,A7                // room for result
  76.     MOVE.L        22(A7),-(A7)        // push copy of resType
  77.     MOVE.W        24(A7),-(A7)        // push copy of resID
  78.     JSR            MyGet1ResourceC        // do work
  79.     MOVE.L        (A7)+,22(A7)        // copy and pop result
  80.     MOVE.L        (A7)+,D2            // restore reg
  81.     MOVE.L        (A7)+,D1            // restore reg
  82.     MOVE.L        (A7)+,A1            // restore reg
  83.     MOVE.L        (A7)+,A0            // ready return thru A0
  84.     ADDQ.L        #6,A7                // pop args
  85.     JMP            (A0)                // phone home
  86. }
  87.  
  88. static pascal OSErr LaunchWithSize (const FSSpec *fssP, Size size)
  89. {
  90.     OSErr err = noErr;
  91.  
  92.     LaunchPBPtr lpbp = (LaunchPBPtr) NewPtrClear (sizeof (*lpbp));
  93.     if (!(err = MemError ( )))
  94.     {
  95.         lpbp->launchBlockID            = extendedBlock;
  96.         lpbp->launchEPBLength        = extendedBlockLen;
  97.         lpbp->launchControlFlags    = launchContinue | launchNoFileFlags;
  98.         lpbp->launchAppSpec            = (FSSpecPtr) fssP;
  99.  
  100.         gPreferredLaunchSize = size;
  101.  
  102.         gGet1Resource = (vGet1Resource) GetToolTrapAddress (_Get1Resource);
  103.         SetToolTrapAddress ((UniversalProcPtr) MyGet1ResourceAsm, _Get1Resource);
  104.         {
  105.             err = LaunchApplication (lpbp);
  106.         }
  107.         SetToolTrapAddress ((UniversalProcPtr) gGet1Resource, _Get1Resource);
  108.  
  109.         DisposePtr ((Ptr) lpbp);
  110.         if (!err) err = MemError ( );
  111.     }
  112.  
  113.     return err;
  114. }
  115.  
  116. void main (void)
  117. {
  118.     if (InitMac ( ))
  119.         SysBeep (10);
  120.     else
  121.     {
  122.         OSErr    err = noErr;
  123.         FSSpec    fss;
  124.  
  125.         if (!(err = FSMakeFSSpec (0,0,"\pLaunchFodder",&fss)))
  126.             if (!(err = LaunchWithSize (&fss, 1024L * 1024L)))
  127.                 ;
  128.     }
  129. }
  130.